package com.ahao.sdk.utils;

import java.lang.reflect.Field;
import java.util.Properties;

public class ConfigBuilder {

    /**
     * 根据配置类的 Class 对象和配置文件读取相应配置值，返回配置类的实例
     *
     * @param configClass 配置类的 Class 对象
     * @param properties  包含配置信息的 Properties 对象
     * @param <T>         配置类的类型
     * @return 配置类的实例
     */
    public static <T> T buildConfig(Class<T> configClass, Properties properties) {
        try {
            T configInstance = configClass.getDeclaredConstructor().newInstance();

            for (Field field : configClass.getDeclaredFields()) {
                // 设置字段访问权限
                field.setAccessible(true);

                // 获取配置文件中的配置项值
                String configKey = field.getName();
                String configValue = properties.getProperty(configKey);

                // 如果配置项值存在，则设置到配置类实例中
                if (configValue != null) {
                    setField(configInstance, field, configValue);
                }
            }

            return configInstance;
        } catch (Exception e) {
            e.printStackTrace(); // 处理异常
            return null;
        }
    }

    /**
     * 设置配置类的字段值
     *
     * @param instance 配置类的实例
     * @param field    配置类的字段
     * @param value    配置项的值
     * @param <T>      配置类的类型
     * @throws IllegalAccessException 如果无法访问字段
     */
    private static <T> void setField(T instance, Field field, String value) throws IllegalAccessException {
        Class<?> fieldType = field.getType();

        if (fieldType == String.class) {
            field.set(instance, value);
        } else if (fieldType == int.class || fieldType == Integer.class) {
            field.set(instance, Integer.parseInt(value));
        } else if (fieldType == boolean.class || fieldType == Boolean.class) {
            field.set(instance, Boolean.parseBoolean(value));
        } // 可以根据需要添加其他类型的处理

        // 如果有其他类型的字段，继续添加相应的处理
    }
}
